package com.bit.cfdi.web.domain;


import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Calendar;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Version;

@Entity
@Table(name = "impuesto")
public class Impuesto implements Serializable {

	private static final long serialVersionUID = 1L;
	// Fields

	private Long idImpuesto;
	private String tipoImpuesto;	
	private String categoriaImpuesto;
	private String siglaImpuesto;
	private String nombreImpuesto;	
	private Double tasa;
	private Boolean impuestoPorDefecto;
	private Long ultimaModificacionPor;
	private Calendar fechaModificacion;
	private Integer status;
	
	// Constants
	public final static String TIPO_IMPUESTO_TRASLADO = "Traslado";
	public final static String TIPO_IMPUESTO_RETENIDO = "Retenci\u00F3n";
	
	public final static String CATEGORIA_IMPUESTO_FEDERAL = "Federal";
	public final static String CATEGORIA_IMPUESTO_LOCAL = "Local";	
	
	public final static String APLICA_A_FACTURA = "Fact";
	public final static String APLICA_A_CONCEPTO = "Cpto";
	public final static String APLICA_A_SERVICIOS = "Serv";
	
	public final static String IMP_SOBRE_RENTA = "ISR";
	public final static String IMP_VALOR_AGREGADO = "IVA";
	public final static String IMP_VALOR_AGREGADO_FRONTERA = "IVA Frontera";
	public final static String IMP_VALOR_AGREGADO_EXPORTACION = "IVA Exportaci\u00F3n";
	public final static String IMP_ESPECIAL_PROD_SERV = "IEPS";
	public final static String IMP_SOBRE_SERV_HOTELEROS = "ISSH";
	public final static String IMP_RET_IVA = "Ret IVA";
	public final static String IMP_SOBRE_FLETE = "ISF";
		
	public final static String LEYENDA_IVA = "Impuesto al valor agregado";
	public final static String LEYENDA_IVA_EXENTO = "Impuesto al valor agregado exento";
	public final static String LEYENDA_IVA_TASA_0 = "Impuesto al valor agregado tasa 0";
	public final static String LEYENDA_ISR = "Impuesto sobre la renta";
	public final static String LEYENDA_IEPS = "Impuesto especial sobre producci\u00F3n y servicios";
	public final static String LEYENDA_ISSH = "Impuesto sobre servicios hoteleros";
	public final static String LEYENDA_RET_IVA = "Retenci\u00F3n del IVA";
	public final static String LEYENDA_ISF = "Impuesto sobre flete";
	
	public final static double TASA_IVA_FRONTERA = 11.0000;
	public final static double TASA_RET_IVA_FRONTERA = 7.3333;
	public final static double TASA_IVA = 16.0000;
	public final static double TASA_RET_IVA = 10.6666;
	public final static double TASA_CERO = 0.0;
	public final static double TASA_IVA_EXPORTACION = 4.0;
	public final static double TASA_RET_IVA_COMPLETO = 16.0000;
	public final static double TASA_RET_IVA_COMPLETO_FRONTERA = 11.0000;
	
	// Property accessors
	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "id_impuesto", nullable = false)
	public Long getIdImpuesto() {
		return this.idImpuesto;
	}

	public void setIdImpuesto(Long idImpuesto) {
		this.idImpuesto = idImpuesto;
	}

	@Column(name = "tipo_impuesto", length = 100)
	public String getTipoImpuesto() {
		return this.tipoImpuesto;
	}

	public void setTipoImpuesto(String tipoImpuesto) {
		this.tipoImpuesto = tipoImpuesto;
	}
	
	@Column(name = "categoria_impuesto", length = 100)
	public String getCategoriaImpuesto() {
		return this.categoriaImpuesto;
	}

	public void setCategoriaImpuesto(String categoriaImpuesto) {
		this.categoriaImpuesto = categoriaImpuesto;
	}

	@Column(name = "nombre_impuesto", length = 100)
	public String getNombreImpuesto() {
		return this.nombreImpuesto;
	}

	public void setNombreImpuesto(String nombreImpuesto) {
		this.nombreImpuesto = nombreImpuesto;
	}
	
	@Column(name = "sigla_impuesto", length = 100)
	public String getSiglaImpuesto() {
		return this.siglaImpuesto;
	}

	public void setSiglaImpuesto(String siglaImpuesto) {
		this.siglaImpuesto = siglaImpuesto;
	}
	
	@Column(name = "ultima_modificacion_por")
	public Long getUltimaModificacionPor() {
		return this.ultimaModificacionPor;
	}

	public void setUltimaModificacionPor(Long ultimaModificacionPor) {
		this.ultimaModificacionPor = ultimaModificacionPor;
	}

	@Column(name = "tasa", precision = 10, scale = 6)
	public Double getTasa() {
		return this.tasa;
	}

	public void setTasa(Double tasa) {
		this.tasa = tasa;
	}
	
	@Column(name = "fecha_modificacion")
	@Temporal(TemporalType.TIMESTAMP)
	@Version
	public Calendar getFechaModificacion() {
		return this.fechaModificacion;
	}

	public void setFechaModificacion(Calendar fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}
	
	@Basic
	@Column(name = "impuesto_por_defecto")
	public Boolean getImpuestoPorDefecto() {
		return this.impuestoPorDefecto;
	}

	public void setImpuestoPorDefecto(Boolean  impuestoPorDefecto) {
		this.impuestoPorDefecto = impuestoPorDefecto;
	}
	
	@Column(name = "status")
	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}
	
}